import { history } from 'umi';

import { getUser } from './../services/user.js';

//TODO：我不知道哪里看到这个用法，目前版本还能用，他是dva中的，umi可以用上面的history实现编程式路由
const { routerRedux } = require('dva');

//TODO:用户信息本地存储，这能避免用户使用浏览器刷新页面是store信息丢失问题，
//		这种处理方式具有普遍性，只与状态管理有关。
function getUserFromLocal() {
    try {
        let str = window.localStorage.getItem('auth-user');
        if (str) {
            return JSON.parse(str);
        } else {
            return {
                name: 'guest',
            };
        }
    } catch (err) {
        window.localStorage.removeItem('auth-user');
        console.log('获取本地数据出错');
    }
}

/**
 *	effects函数第一个参数action是用户界面dispatch触发的，type、payload是我们自己传入的，第二个参数叫effects，
 *		他就是saga提供的副作用管理器对象，包含众多属性方法，上面代码我解构了可能要用到的几个
 *
 *	effects方法名不要写的和reducer一样，因为前台dispatch既能触发effects,也能触发reducer，倒是不建议直接触发reducer，
 *		上面代码如果将logout写成一样就会进入来回调用的死循环。
 */
export default {
    namespace: 'user',
    state: {
        user: getUserFromLocal(), //用户信息
        loginResult: 'none', //用户登录结果错误提示，默认none，登录成功后也为none
    },
    reducers: {
        setUser(state, action) {
            let newState = JSON.parse(JSON.stringify(state));
            newState.user = action.payload;
            newState.loginResult = 'none';
            return newState;
        },
        setLoginResult(state, action) {
            let newState = JSON.parse(JSON.stringify(state));
            newState.loginResult = 'block'; //只有登录失败时才将值置为block
            return newState;
        },
        setLogout(state, action) {
            let newState = JSON.parse(JSON.stringify(state));
            newState.user = action.payload;
            newState.loginResult = 'none';
            return newState;
        },
    },
    effects: {
        *getUser({ type, payload }, { all, apply, call, put, takeEvery }) {
            let response = yield getUser(payload);
            let result = yield response.json();
            if (result.state) {
                window.localStorage.setItem(
                    'auth-user',
                    JSON.stringify(result.data),
                );
                yield put({
                    type: 'setUser',
                    payload: result.data,
                });
            } else {
                yield put({
                    type: 'setLoginResult',
                    payload: '',
                });
            }
            yield put(routerRedux.push('/')); //以后统一使用下面的history，他是正统
        },
        *logout(action, effects) {
            window.localStorage.removeItem('auth-user');
            yield effects.put({
                type: 'setLogout',
                payload: {
                    name: 'guest',
                },
            });
            history.push('/login');
        },
    },
};
